with Ada.Text_IO; use Ada.Text_IO;
with My_String.IO; use My_String.IO;
with Matiere.IO; use Matiere.IO;

package body Matiere is

   -----------------------------------INTITULE----------------------------------------------------
   function Tester_Intitule(Matieres : Type_Matieres; Intitule : Type_String) return Boolean is
   begin
      Put_Line("Nombre : " & Type_Nombre_Matieres'Image(Matieres.Nombre));
      Put_Line(Afficher_String(Intitule));
      for I in 1..Matieres.Nombre loop
         if equals(Matieres.Tab(I).Intitule,Intitule) then
            return True;
         end if;
      end loop;
      return False;
   end Tester_Intitule;

   function Index_Intitule(Matieres : Type_Matieres; Intitule : Type_String) return Integer is
   begin
      for I in 1..Matieres.Nombre loop
         if  equals(Matieres.Tab(I).Intitule,Intitule)  then
            return I;
         end if;
      end loop;
      return -1;
   end Index_Intitule;

   -------------------------------------MATIERES----------------------------------------------------

   procedure Retirer_Matiere(Matieres : in out Type_Matieres; Intitule : Type_String) is
      NV_Matieres : Type_Matieres;
      NV_Valeur : Type_Nombre_Matieres := Matieres.Nombre;
   begin

      if Tester_Intitule(Matieres,Intitule) then

         For I in 1..Matieres.Nombre loop
            if equals(Matieres.Tab(I).Intitule,Intitule) = False then
               NV_Matieres.Tab(NV_Valeur) := Matieres.Tab(I);
            else
               NV_Valeur := NV_Valeur -1;
            end if;
         end loop;

      end if;

      Matieres.Nombre := NV_Valeur;
      Matieres.Tab(1..Matieres.Nombre) := NV_Matieres.Tab(1..NV_Valeur);

   end Retirer_Matiere;

   ------------------------------------------NOTE----------------------------------------------------

   function Note_To_Float(Note : Type_Note) return Float is
   begin
      if Note.Selon = Libre then
         return -1.0;
      else
         return Float(Note.Valeur.Avant_Virgule + Note.Valeur.Apres_Virgule/100);
      end if;
   end Note_To_Float;

   -------------------------------------------------------------------------------------------------
   procedure Liberer(Mat : out Type_Matiere) is
   begin
      Mat.Note := ( Selon => Libre);
   end Liberer;

   procedure Simuler(Mat : out Type_Matiere) is
      NV_NOTE : Type_Note_Valeur;
   begin
      if Mat.Note.Selon = Libre then
         Put("Note simulee :");
         NV_Note := Saisir_Note_Valeur;
         Mat.Note := (Selon => Simulee, Valeur => NV_NOTE);
         Put_Line("Note simulee");
      end if;
   end Simuler;

   procedure Attribuer(Mat : out Type_Matiere) is
      NV_NOTE : Type_Note_Valeur;
   begin
      if Mat.Note.Selon /= Attribuee then
         Put("Note :");
         NV_Note := Saisir_Note_Valeur;
         Mat.Note := (Selon => Attribuee, Valeur => NV_Note);
         Put_Line("Note attribuee");
      else
         Put_Line("Cette matiere a deja une note d'attribuee");
      end if;
   end Attribuer;

   procedure Modifier(Mat : out Type_Matiere) is
      NV_NOTE : Type_Note_Valeur;
   begin
      if Mat.Note.Selon = Attribuee then
         Put("Ancienne note :" & Afficher_Note(Mat.Note));
         Put("Nouvelle Note :");
         NV_Note := Saisir_Note_Valeur;
         Mat.Note.Valeur := NV_Note;
         Put_Line("Note modifie");
      else
         Put_Line("Cette matiere n'a pas encore de note attribuee");
      end if;
   end Modifier;

end Matiere;